package roteador;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Listener implements Runnable {

    private DatagramSocket socket;
    private Roteador roteador;
    private boolean cancelar = false;
    public final static int TAMANHO_PACOTE = 1024;

    public Listener(int porta, Roteador roteador) {
        try {
            this.socket = new DatagramSocket(porta);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        this.roteador = roteador;
    }

    public int getRoteadorID() {
        return this.roteador.getID();
    }

    public synchronized void run() {
        DatagramPacket cabecalho = new DatagramPacket(new byte[TAMANHO_PACOTE],
                TAMANHO_PACOTE);

        while (true) {
            if (cancelar) {
                System.out.println("fechou o socket " + roteador.getID());
                socket.close();
                break;
            }
            try {
                socket.receive(cabecalho);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String messagem = new String(cabecalho.getData());
            messagem = messagem.trim();
            ListaDeRoteamento lr = Mensagem.tratarVetorDistancia(messagem);
            roteador.reiniciarTimeout(lr.getIdRoteador());
            roteador.atualizarListaRoteamento(lr);

        }
    }

    public void cancelar() {
        this.cancelar = true;
    }
}
